package day13;

import java.util.Objects;

/**
 * @Author juzipi
 * @Date 2021/6/28 16:19
 * @Info
 */
public class Question {
    //day12忘换包了...

    /*
    面试题：
    1.多态是编译时行为还是运行时行为?
        是运行时行为
    2.final,finally,finalize的区别


    3.== 和 equals 的区别
    ==: 对于基本数据类型 ==比较的是值(不一定非要类型相同)，引用类型比较的就是地址值是否相同
    equals: 不能用于基本数据类型的比较，引用类型比较的是值
    需要注意的是equals没有重写过的话比较的也是地址，只是大部分类都重写了equals，重写以后比较的就是值了
    == 符号使用时变量类型要一致
     */
    public static void main(String[] args) {
        int i = 10;
        int j = 10;
        double z = 10.0;
        System.out.println(i==j);
        System.out.println(z==i);
        Customer customer = new Customer();
        Customer customer1 = new Customer();
        System.out.println(customer==customer1);//false
        //object类中定义的equals()和==是相同的
        System.out.println(customer.equals(customer1));
        String s = new String("1");
        String s1 = new String("1");
        System.out.println(s.equals(s1));
//        System.out.println(customer == s);
    }

}

class Customer{

    private String name;

    private int age;



    public Customer() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        //首先比较地址值，相同肯定就是同一个
        if (this == o){
            return true;
        }
        //比较两个的类是否相同
        if (o == null || getClass() != o.getClass()){
            return false;
        }

        Customer customer = (Customer) o;

        if (age != customer.age) {
            return false;
        }
        //这个equals是String的equals，不是递归调用！
        //name != null ? name.equals(customer.name) : customer.name == null
        return Objects.equals(name, customer.name);
    }



    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}
